//package com.gb.demand.util;
//
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.BeanWrapper;
//import org.springframework.beans.BeanWrapperImpl;
//
//import java.lang.reflect.Field;
//import java.util.*;
//import java.util.function.Function;
//import java.util.function.Predicate;
//import java.util.stream.Collectors;
//
///**
// * @Author Bazinga
// * @Description
// * @Date Create in 2019-03-06
// * @Modified By:
// */
//@Slf4j
//public class MyBeanUtils<E> extends BeanUtils {
//
//	public static String[] getNullPropertyNames(Object source) {
//		final BeanWrapper src = new BeanWrapperImpl(source);
//		java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
//
//		Set<String> emptyNames = new HashSet<>();
//		for (java.beans.PropertyDescriptor pd : pds) {
//			Object srcValue = src.getPropertyValue(pd.getName());
//			if (ToolUtil.isEmpty(srcValue)) {
//				emptyNames.add(pd.getName());
//			}
//		}
//		String[] result = new String[emptyNames.size()];
//		return emptyNames.toArray(result);
//	}
//
//	/**
//	 * 解决org.springframework.beans.BeanUtils的copyProperties方法
//	 * 复制时候,弊端就是会将null也复制过来
//	 * 当想要 复制后的类某些值不会被src 中的null给覆盖时候, 考虑此方法
//	 *
//	 * @param src
//	 * @param src
//	 */
//	public static void copyPropertiesNotNull(Object src, Object target) {
//		BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
//	}
//
//	/**
//	 * 将集合中的元素类型转成 自定义类型
//	 *
//	 * @param sourceList
//	 * @param eClass
//	 * @param <E>
//	 * @return
//	 */
//	public static <E> List<E>
//	copyListProperties(List sourceList, Class<E> eClass) {
//		List<E> targetList = new ArrayList<>();
//		sourceList.forEach(source ->
//			targetList.add(copyProperties(source, eClass))
//		);
//		return targetList;
//	}
//
//	/**
//	 * 将数组中的元素类型转成 自定义类型
//	 *
//	 * @param sources
//	 * @param eClass
//	 * @param <E>
//	 * @return
//	 */
//	public static <E> List<E> copyListProperties(Object[] sources, Class<E> eClass) {
//		return copyListProperties(Arrays.asList(sources), eClass);
//	}
//
//	/**
//	 * 将数组中的元素类型转成 自定义类型
//	 *
//	 * @param sources
//	 * @param eClass
//	 * @param <E>
//	 * @return
//	 */
//	public static <E> E copyProperties(Object sources, Class<E> eClass) {
//		if (sources == null) {
//			return null;
//		}
//		E target = getE(eClass);
//		copyProperties(sources, target);
//		return target;
//	}
//
//	/**
//	 * 将数组中的元素类型转成 自定义类型
//	 *
//	 * @param sources
//	 * @param eClass
//	 * @param ignoreProperties 忽略属性
//	 * @param <E>
//	 * @return
//	 */
//	public static <E> E copyProperties(Object sources, Class<E> eClass, String... ignoreProperties) {
//		if (sources == null) {
//			return null;
//		}
//		E target = getE(eClass);
//		copyProperties(sources, target, ignoreProperties);
//		return target;
//	}
//
//	/**
//	 * 对比数据，以第一个为标准，有值对比没有跳过
//	 *
//	 * @param o1
//	 * @param o2
//	 * @return
//	 */
//	public static <E> boolean equalsWithoutNull(E o1, E o2) {
//		if (o1 == o2) {
//			return true;
//		}
//		if (o1 == null) {
//			return false;
//		}
//		Field[] fields = o1.getClass().getDeclaredFields();
//		// 检查是否
//	return 	Arrays.stream(fields).filter(e -> !ToolUtil.equals(e.getName(), "serialVersionUID")).allMatch(e -> {
//			try {
//				e.setAccessible(true);
//				if (ToolUtil.isEmpty(e.get(o1)) || Objects.equals(e.get(o1), e.get(o2))) {
//					return Boolean.TRUE;
//				}
//			} catch (IllegalAccessException e1) {
//				log.info("context", e);
//			}
//			return Boolean.FALSE;
//		});
//	}
//
//
//	/**
//	 * 初始化一个指定类型的对象
//	 *
//	 * @param eClass
//	 * @param <E>
//	 * @return
//	 */
//	private static <E> E getE(Class<E> eClass) {
//		E e = null;
//		try {
//			e = eClass.newInstance();
//		} catch (InstantiationException e1) {
//			e1.printStackTrace();
//		} catch (IllegalAccessException e1) {
//			e1.printStackTrace();
//		}
//		return e;
//	}
//
//	/**
//	 * 获取某个对象里 满足特定条件的属性名
//	 *
//	 * @param obj
//	 * @param predicate
//	 * @return
//	 */
//	public static List<String> getFilterFieldNames(Object obj, Predicate<Object> predicate) {
//		Field[] fields = obj.getClass().getDeclaredFields();
//		List<String> list = Arrays.stream(fields).filter(e -> {
//			try {
//				e.setAccessible(true);
//				if (predicate.test(e.get(obj))) {
//					return Boolean.TRUE;
//				}
//			} catch (IllegalAccessException e1) {
//				e1.printStackTrace();
//			}
//			return Boolean.FALSE;
//		}).map(Field::getName).collect(Collectors.toList());
//		return list;
//	}
//
//	/**
//	 * 获取当前对象【fieldName】属性的值
//	 *
//	 * @param obj       对象
//	 * @param fieldName 属性名
//	 * @return
//	 * @throws Exception
//	 */
//	public static Object getValue(Object obj, String fieldName) throws Exception {
//		if (obj == null || StringUtils.isEmpty(fieldName)) {
//			return null;
//		}
//		// 获取对象的属性
//		Field field = obj.getClass().getDeclaredField(fieldName);
//		// 对象的属性的访问权限设置为可访问
//		field.setAccessible(true);
//		// 返回此属性的值
//		return field.get(obj);
//	}
//
//	/**
//	 * 获取当前对象【fieldName】属性的值
//	 *
//	 * @param obj       对象
//	 * @param fieldName 属性名
//	 * @return
//	 * @throws Exception
//	 */
//	public static List<String> getFieldNames(Object obj, String fieldName) throws Exception {
//		if (obj == null || StringUtils.isEmpty(fieldName)) {
//			return null;
//		}
//		Field[] fields = obj.getClass().getDeclaredFields();
//		return Arrays.stream(fields).map(Field::getName).collect(Collectors.toList());
//	}
//
//	/**
//	 * 获取属性值为0的属性名
//	 *
//	 * @param obj
//	 * @return
//	 */
//	public static List<String> getClazz0Name(Object obj) {
//		return getFilterFieldNames(obj, (o) -> o != null && o.equals(0));
//	}
//
//	/**
//	 * 转换bean中某些字段
//	 *
//	 * @param e
//	 * @param function
//	 * @param <E>
//	 * @return
//	 */
//	public static <E> E beanFunction(E e, Function<Object, Object> function) {
//		Field[] fields = e.getClass().getDeclaredFields();
//		for (Field field : fields) {
//			field.setAccessible(true);
//			try {
//				field.set(e, function.apply(field.get(e)));
//			} catch (IllegalAccessException e1) {
//				e1.printStackTrace();
//			}
//		}
//		return e;
//	}
//
//	/**
//	 * 将属性中数字0转为null
//	 *
//	 * @param e
//	 * @param <E>
//	 * @return
//	 */
//	public static <E> E beenFunctionNUll(E e) {
//		return beanFunction(e, (o) -> (o != null && o.equals(0)) ? null : o);
//	}
//}
